package com.tanhua.server.service;

import com.tanhua.domain.db.UserInfo;
import com.tanhua.domain.mongo.Comment;
import com.tanhua.domain.mongo.Publish;
import com.tanhua.domain.vo.CommentVo;
import com.tanhua.domain.vo.PageResult;
import com.tanhua.dubbo.api.db.UserInfoApi;
import com.tanhua.dubbo.api.mongo.CommentApi;
import com.tanhua.dubbo.api.mongo.PublishApi;
import com.tanhua.server.interceptor.UserHolder;
import org.apache.dubbo.config.annotation.Reference;
import org.bson.types.ObjectId;
import org.joda.time.DateTime;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 评论管理业务逻辑处理层
 */
@Service
public class CommentService {

    @Reference
    private CommentApi commentApi;

    @Reference
    private UserInfoApi userInfoApi;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Reference
    private PublishApi publishApi;

    /**
     * 分页查询评论列表
     * movementId:动态id
     */
    public PageResult<CommentVo> queryPageByPublishId(int page, int pagesize, String movementId) {
        PageResult<CommentVo> voPageResult = new PageResult<>();

        //a.调用服务提供根据动态id、评论类型=2、评论内容类型=1分页查询评论列表数据服务方法
        PageResult<Comment>  commentPageResult = commentApi.queryPageByPublishId(page,pagesize,movementId);
        if(commentPageResult == null || CollectionUtils.isEmpty(commentPageResult.getItems())){
            return new PageResult<>(0l,10l,0l,1l,null);
        }
        ///b.根据评论表中userid作为条件 调用用户信息服务 获取用户信息
        //将List<Comment>转为 List<CommentVo>
        List<CommentVo> listCommentVo = new ArrayList<>();
        for (Comment comment : commentPageResult.getItems()) {
            CommentVo commentVo = new CommentVo();
            Long userId = comment.getUserId();//评论的用户id
            UserInfo userInfo = userInfoApi.queryUserInfo(userId);
            //将comment  userInfo 数据封装到commentVo中
            BeanUtils.copyProperties(userInfo,commentVo);//头像 昵称
            commentVo.setContent(comment.getContent());//评论内容
            commentVo.setCreateDate(new DateTime(comment.getCreated()).toString("yyyy年MM月dd日 HH:mm"));//评论时间
            commentVo.setLikeCount(comment.getLikeCount());//点赞数
            commentVo.setHasLiked(0);//是否点赞 1：是 0：否

            String key = "comment_like_"+userId+"_"+comment.getId().toHexString();
            if(StringUtils.isEmpty(redisTemplate.opsForValue().get(key))){
                commentVo.setHasLiked(0);////是否点赞（1是，0否）
            }else
            {
                commentVo.setHasLiked(1);////是否点赞（1是，0否）
            }


            commentVo.setId(comment.getId().toHexString());//评论主键id (一定不要设置错)
            listCommentVo.add(commentVo);
        }
        //c.封装Vo返回
        BeanUtils.copyProperties(commentPageResult,voPageResult);
        voPageResult.setItems(listCommentVo);
        return voPageResult;
    }

    /**
     * 发布评论
     */
    public void saveComment(String publishId, String content) {
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(publishId));//发布id
        comment.setCommentType(2);//评论类型 2：评论
        comment.setPubType(1);//评论内容类型 1：针对动态操作
        comment.setContent(content);//评论内容
        comment.setUserId(UserHolder.getUserId());//当前评论用户id
        if(comment.getPubType() == 1){
            //根据发布id查询发布表 获取userId(PublishUserId)
            Publish publish = publishApi.querySinglePublish(publishId);
            comment.setPublishUserId(publish.getUserId());//被评论的用户id
        }
        commentApi.saveComment(comment);
    }

    /**
     * 评论点赞
     * commentId:评论id(被评论的主键id)
     */
    public int saveCommentLike(String commentId) {
        Long userId = UserHolder.getUserId();
        //a.封装Comment对象调用服务保存评论点赞记录
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(commentId));//这里存的是被评论主键id
        comment.setCommentType(1);//评论类型，1-点赞，2-评论，3-喜欢
        comment.setPubType(3);  //评论内容类型： 1-对动态操作 2-对视频操作 3-对评论操作
        comment.setUserId(userId);//当前操作的用户id
        int count = commentApi.saveComment(comment);
        //b.将评论点赞操作记录写入redis
        String key = "comment_like_"+userId+"_"+commentId;//保证唯一 业务前缀标识+userId+publishId
        redisTemplate.opsForValue().set(key,"1");
        //c.改造分页查询评论列表-是否点赞 1：是 0：否
        return count;
    }

    /**
     * 评论取消点赞
     * commentId:评论id(被评论的主键id)
     */
    public int saveCommentDisLike(String commentId) {
        Long userId = UserHolder.getUserId();
        //a.服务提供者：取消点赞服务方法 返回点赞数量
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(commentId));//评论主键id
        comment.setCommentType(1);//评论类型，1-点赞，2-评论，3-喜欢
        comment.setPubType(3);//评论内容类型： 1-对动态操作 2-对视频操作 3-对评论操作
        comment.setUserId(userId);//userId
        int likeCount = commentApi.removeComment(comment);
        //b.将点赞记录从redis删除
        String key = "comment_"+userId+"_"+commentId;//保证唯一 业务前缀标识+userId+publishId
        redisTemplate.delete(key);
        //c.将点赞数封装返回给app展示
        return likeCount;
    }
}
